/*
 * Copyright 2014 STNet,Inc..
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package jp.co.stnet.apps.medcloud.domain.services.api;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
import org.springframework.security.oauth2.provider.token.JdbcTokenStore;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import jp.co.stnet.apps.medcloud.core.exception.BusinessException;
import jp.co.stnet.apps.medcloud.core.message.ResultMessages;

/**
 * クラウド利用者解除処理を行います。
 *
 * @author stnetadmin
 */
@Service
public class WithdrawResourceService {

    private static final Logger logger = LoggerFactory.getLogger(WithdrawResourceService.class);

    /**
     * OAuthトークンストア
     */
    private JdbcTokenStore tokenStore;

    /**
     * OAuth トークンストアアクセス用データソース
     */
    private DataSource dataSource;

    /**
     * メッセージ
     */
    @Autowired
    MessageSource messageSource;

    /**
     * constructor
     */
    public WithdrawResourceService() {
        // OAuth 用データソース
        ApplicationContext context
                = new ClassPathXmlApplicationContext("/META-INF/spring/medcloud-domain.xml");
        dataSource = (DataSource) context.getBean("oauthDataSource");
        tokenStore = new JdbcTokenStore(dataSource);
    }

    /**
     * クラウド利用解除処理を行います。
     *
     * @param token
     * @throws BusinessException
     */
    @Transactional
    public void withdraw(String token) throws BusinessException {

        String accessTokenId = null;
        String refreshTokenId = null;

        // アクセストークン存在チェック
        OAuth2AccessToken at = tokenStore.readAccessToken(token);
        if (at != null) {

            // アクセストークン経由でリフレッシュトークンを取得する
            OAuth2RefreshToken rt = at.getRefreshToken();
            refreshTokenId = rt.getValue();

            // アクセストークンを削除する
            tokenStore.removeAccessToken(token);

        } else {
            logger.debug("\n\tAccess Token Not Exist(Not Removed)!");
        }

        // リフレッシュトークン存在チェック
        OAuth2RefreshToken refreshToken = tokenStore.readRefreshToken(refreshTokenId);
        if (refreshToken != null) {
            // リフレッシュトークンを削除する
            tokenStore.removeRefreshToken(refreshTokenId);
        } else {
            logger.debug("\n\tRefresh Token Not Exist(Not Removed)!");
        }

        // TODO START
        // その他、関連クラウドデータを論理削除する
        if (false) {
            // エラー発生時は以下のように。
            ResultMessages messages = ResultMessages.error().add("e.md.fw.9001", messageSource);
            throw new BusinessException(messages);
        }
    }
}
